package patterns.structural.adapter;

/**
 * 适配器模式示例
 * 将一个类的接口转换成客户希望的另外一个接口
 */
public class AdapterPattern {

    public static void main(String[] args) {
        // 使用目标接口
        Target target = new ConcreteTarget();
        target.request();
        
        // 使用类适配器
        System.out.println("\n===== 类适配器模式 =====");
        Target classAdapter = new ClassAdapter();
        classAdapter.request();
        
        // 使用对象适配器
        System.out.println("\n===== 对象适配器模式 =====");
        Adaptee adaptee = new Adaptee();
        Target objectAdapter = new ObjectAdapter(adaptee);
        objectAdapter.request();
        
        // 实际应用示例：将旧的数据格式适配到新的接口
        System.out.println("\n===== 实际应用示例 =====");
        // 旧系统的数据源
        LegacyRectangle legacyRectangle = new LegacyRectangle();
        legacyRectangle.setWidth(5);
        legacyRectangle.setHeight(10);
        
        // 通过适配器使用旧系统的数据
        Shape rectangleAdapter = new RectangleAdapter(legacyRectangle);
        System.out.println("绘制适配后的矩形，面积为: " + rectangleAdapter.getArea());
    }
}

/**
 * 目标接口
 */
interface Target {
    void request();
}

/**
 * 具体目标类
 */
class ConcreteTarget implements Target {
    @Override
    public void request() {
        System.out.println("ConcreteTarget.request()");
    }
}

/**
 * 被适配的类
 */
class Adaptee {
    public void specificRequest() {
        System.out.println("Adaptee.specificRequest()");
    }
}

/**
 * 类适配器
 * 通过继承被适配类实现适配
 */
class ClassAdapter extends Adaptee implements Target {
    @Override
    public void request() {
        System.out.println("ClassAdapter.request() - 通过继承方式适配");
        specificRequest();
    }
}

/**
 * 对象适配器
 * 通过组合被适配对象实现适配
 */
class ObjectAdapter implements Target {
    private Adaptee adaptee;
    
    public ObjectAdapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }
    
    @Override
    public void request() {
        System.out.println("ObjectAdapter.request() - 通过组合方式适配");
        adaptee.specificRequest();
    }
}

/**
 * 实际应用示例
 */

// 新系统的接口
interface Shape {
    double getArea();
}

// 旧系统的类
class LegacyRectangle {
    private int width;
    private int height;
    
    public void setWidth(int width) {
        this.width = width;
    }
    
    public void setHeight(int height) {
        this.height = height;
    }
    
    public int getWidth() {
        return width;
    }
    
    public int getHeight() {
        return height;
    }
}

// 适配器：将旧的矩形类适配到新的Shape接口
class RectangleAdapter implements Shape {
    private LegacyRectangle legacyRectangle;
    
    public RectangleAdapter(LegacyRectangle legacyRectangle) {
        this.legacyRectangle = legacyRectangle;
    }
    
    @Override
    public double getArea() {
        return legacyRectangle.getWidth() * legacyRectangle.getHeight();
    }
} 